const dayjs = require('./dayjs.min')

// 功能函数临时储存器
let doLastTimeout, doLastOperates = []
let doFirstTimeout, doFirstOperates = []
let timeout = 500

module.exports = {
  /**
   * 使用dayjs格式化日期
   * @param {any} time 时间
   * @param {string} format 定制格式
   */
  formatDate(time, format) {
    return dayjs(time).format(format || 'YYYY-MM-DD')
  },
  /**
   * 对比今天是明天今天昨天前天等
   * @param {any} time 时间
   */
  formatDateDayByDay(time) {
    // console.log(time)
    const cur = dayjs()
    let diff = dayjs.unix(time).diff(cur, 'day')
    // console.log(diff)
    // 为0也可能不超过24小时则为昨天
    if (!diff && !dayjs.unix(time).isSame(cur, 'day')) {
      diff = -1
    }
    if (Math.abs(diff) > 2) {
      const day = dayjs.unix(time).date()
      // console.log(~~(day / 10) ? day : `0${day}`)
      // console.log({
      //   day: ~~(day / 10) ? day : `0${day}`,
      //   month: dayjs(time).month() + 1,
      // })
      return {
        day: ~~(day / 10) ? day : `0${day}`,
        month: dayjs.unix(time).month() + 1,
      }
    } else {
      let day
      switch (diff) {
        case 2:
          day = '后天'
          break
        case 1:
          day = '明天'
          break
        case 0:
          day = '今天'
          break
        case -1:
          day = '昨天'
          break
        case -2:
          day = '前天'
          break
      }
      return {
        day,
      }
    }
  },
  /**
   * 异步执行的多个操作，只执行最后一个操作，比如输入内容检索
   * @param {function} operate 传入的操作
   * @param {number} idx (可选)执行特性索引号的操作，一般不会用到
   */
  debounce(operate, time = timeout, idx) {
    if (typeof operate !== 'function') {
      throw '执行doLast函数报错：需要传入函数！'
    }
    clearTimeout(doLastTimeout)
    doLastTimeout = setTimeout(_ => {
      let lastOperate = doLastOperates[doLastOperates.length - 1]
      lastOperate()
      doLastOperates = []
      clearTimeout(doLastTimeout)
      doLastTimeout = null
    }, time)
    doLastOperates.push(operate)
  },
  /**
   * 异步执行的多个操作，只执行第一个操作，比如同时多个网络请求返回然后提示消息
   * @param {function} operate 传入的操作
   * @param {number} idx (可选)执行特性索引号的操作，一般不会用到
   */
  doFirst(operate, time = timeout, idx) {
    if (typeof operate !== 'function') {
      throw '执行doFirst函数报错：需要传入函数！'
    }
    if (!doFirstTimeout) {
      doFirstTimeout = setTimeout(() => {
        var firstOperate = doFirstOperates[0]
        firstOperate()
        doFirstOperates = []
        clearTimeout(doFirstTimeout)
        doFirstTimeout = null
      }, time)
    }
    doFirstOperates.push(operate)
  },
  /**
   * 某瞬间同步执行的多个操作，只执行最后一个操作，比如同时多个网络请求返回然后提示消息
   * @param {function} operate 传入的操作
   * @param {number} idx (可选)执行特性索引号的操作，一般不会用到
   */
  throttle(operate, time = timeout, idx) {
    if (typeof operate !== 'function') {
      throw '执行doLast函数报错：需要传入函数！'
    }
    if (!doLastTimeout) {
      doLastTimeout = setTimeout(_ => {
        let lastOperate = doLastOperates[doLastOperates.length - 1]
        lastOperate()
        doLastOperates = []
        clearTimeout(doLastTimeout)
        doLastTimeout = null
      }, time)
    }
    doLastOperates.push(operate)
  },
  /**
   * 数字整数部分保持一定长度，不足用0补充，比如时间
   * @params {number} num 传入的数字
   * @params {number} length 数字左侧留着的长度，默认2是作为常用倒计时
   */
  pointLeftNumberLength(num, length = 2) {
    if (typeof (num) === 'number') {
      let numStr = String(num)
      let leftLength = numStr.split('.')[0].length
      if (length > leftLength) {
        let lengthCut = length - leftLength
        let zeroStr = Array.from({
          length: lengthCut
        }, _ => '0').join('')
        numStr = zeroStr + numStr
      }
      return numStr
    } else {
      throw '传数字类型!'
    }
  },
  /* 
  计算模式转图片名
  */
  modelLabel(idx) {
    let label
    switch (idx) {
      case 0:
        label = 'add'
        break
      case 1:
        label = 'sub'
        break
      case 2:
        label = 'mul'
        break
      case 3:
        label = 'div'
        break
      case 4:
        label = 'mix'
        break
      default:
        break
    }
    return label
  }
}